/**
 * 
 */
package br.com.skynix.tcmc.model.seguranca;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.skynix.tcmc.base.model.EntidadeAuditavel;
import br.com.skynix.tcmc.model.rh.Funcionario;

/**
 * @author mgrb
 * 
 */
@Entity
@Table(name = "tb_usuario")
public class Usuario extends EntidadeAuditavel {

	@NotNull
	@Size(max = 255, min = 1)
	@Column(length = 255, nullable = false, name = "email")
	private String username;

	@NotNull
	@Size(max = 50, min = 8)
	@Column(length = 255, nullable = false, name = "senha")
	private String password;

	@Transient
	@NotNull
	private String senhaConfirmacao;

	@NotNull
	@Column(name = "isAdministrador")
	private Boolean administrador;

	@NotNull
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_funcionario_fk", referencedColumnName = "id")
	@ForeignKey(name = "FK001_usuario")
	private Funcionario funcionario;

	@ManyToMany
	@JoinTable(name = "tb_grupo_x_usuario", joinColumns = @JoinColumn(
			name = "id_grupo_fk", referencedColumnName = "id",
			nullable = false, table = "tb_grupo"),
			inverseJoinColumns = @JoinColumn(name = "id_usuario_fk",
					referencedColumnName = "id", nullable = false,
					table = "tb_usuario"))
	@ForeignKey(name = "FK002_grupo_x_usuario")
	private Set<Grupo> grupos;

	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param username the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * @return the funcionario
	 */
	public Funcionario getFuncionario() {
		return funcionario;
	}

	/**
	 * @param funcionario the funcionario to set
	 */
	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	/**
	 * @return the grupos
	 */
	public Set<Grupo> getGrupos() {
		return grupos;
	}

	/**
	 * @param grupos the grupos to set
	 */
	public void setGrupos(Set<Grupo> grupos) {
		this.grupos = grupos;
	}

	/**
	 * @return the senhaConfirmacao
	 */
	public String getSenhaConfirmacao() {
		return senhaConfirmacao;
	}

	/**
	 * @param senhaConfirmacao the senhaConfirmacao to set
	 */
	public void setSenhaConfirmacao(String senhaConfirmacao) {
		this.senhaConfirmacao = senhaConfirmacao;
	}

	/**
	 * @return the administrador
	 */
	public Boolean getAdministrador() {
		return administrador;
	}

	/**
	 * @param administrador the administrador to set
	 */
	public void setAdministrador(Boolean administrador) {
		this.administrador = administrador;
	}
}
